<?php
declare (strict_types = 1);

namespace app\model;

use think\Model;

/**
 * 角色模型
 * Class Role
 * @package app\model
 */
class Role extends Model
{
    // 表名
    protected $name = 'roles';
    
    // 自动时间戳
    protected $autoWriteTimestamp = true;
    
    // 字段类型转换
    protected $type = [
        'id' => 'integer',
        'status' => 'integer',
        'sort' => 'integer',
        'created_at' => 'datetime',
        'updated_at' => 'datetime',
    ];
    
    /**
     * 状态获取器
     * @param $value
     * @param $data
     * @return string
     */
    public function getStatusTextAttr($value, $data)
    {
        $status = [0 => '禁用', 1 => '启用'];
        return $status[$data['status']] ?? '未知';
    }
    
    /**
     * 关联管理员
     * @return \think\model\relation\BelongsToMany
     */
    public function admins()
    {
        return $this->belongsToMany(Admin::class, AdminRole::class, 'admin_id', 'role_id');
    }
    
    /**
     * 关联权限
     * @return \think\model\relation\BelongsToMany
     */
    public function permissions()
    {
        return $this->belongsToMany(Permission::class, RolePermission::class, 'permission_id', 'role_id');
    }
    
    /**
     * 分配权限
     * @param array $permissionIds
     * @return bool
     */
    public function assignPermissions(array $permissionIds): bool
    {
        // 先删除原有权限
        RolePermission::where('role_id', $this->id)->delete();
        
        // 添加新权限
        $data = [];
        foreach ($permissionIds as $permissionId) {
            $data[] = [
                'role_id' => $this->id,
                'permission_id' => $permissionId,
                'created_at' => date('Y-m-d H:i:s')
            ];
        }
        
        if (!empty($data)) {
            return (new RolePermission())->insertAll($data) !== false;
        }
        
        return true;
    }
    
    /**
     * 获取角色权限ID数组
     * @return array
     */
    public function getPermissionIds(): array
    {
        // 如果是超级管理员角色（ID为1），返回所有有效权限ID
        if ($this->id === 1) {
            return Permission::where('status', 1)->column('id');
        }
        
        // 如果权限已经预加载，使用预加载的数据
        if (isset($this->data['permissions'])) {
            return array_column($this->permissions->toArray(), 'id');
        }
        
        // 否则从数据库查询
        return $this->permissions()
            ->where('status', 1)
            ->column('id');
    }
}